
/** 拓展一些调试用方法 */
export default class DebugExt {

    /** 是否启用调试功能 */
    static enable: boolean = CC_DEBUG;

    // 日志统一输出
    private static prefix: string = "HarryNR Debug output:\n";

    /** 在浏览器环境下注册全局对象“_nrDebugInfo”，用于存放调试信息，防止全局对象命名冲突 */
    private static get debugInfo(): { [key: string]: any } {
        if (!this._nrDebugInfo) {
            this._nrDebugInfo = {};
            if (typeof window !== 'undefined') {
                window["_nrDebugInfo"] = this._nrDebugInfo;
            }
        }
        return this._nrDebugInfo;
    }
    private static _nrDebugInfo: { [key: string]: any } = undefined;

    /** 获取调试信息 */
    static getDebugInfo(key: string): any {
        return this.debugInfo[key];
    }

    /** 在网页环境下，将实例对象注册到window全局对象（其余平台无法调试，不需要注册） */
    static addDebugIns<T>(key: string, ins: T): void {
        if (!this.enable || typeof window === 'undefined')
            return;
        this.debugInfo[key] = ins;
    }

    /** 带统一开关的 console.log 方法 */
    static log(...args: any[]) {
        if (!this.enable) return;
        this.print(console.log, "color:#AAAAFF;", ...args);
    }
    /** 带统一开关的 console.info 方法 */
    static info(...args: any[]) {
        if (!this.enable) return;
        this.print(console.info, "color:#AAAAAA;", ...args);
    }
    /** 带统一开关的 console.debug 方法 */
    static debug(...args: any[]) {
        if (!this.enable) return;
        this.print(console.debug, "color:#FFAAAA;", ...args);
    }
    /** 带统一开关的 console.warn 方法 */
    static warn(...args: any[]) {
        this.print(console.warn, "", ...args);
    }
    /** 带统一开关的 console.error 方法 */
    static error(...args: any[]) {
        this.print(console.error, "", ...args);
    }
    /** 带统一开关的 console.assert 方法 */
    static assert(condition?: boolean, ...args: any[]) {
        if (!this.enable) return;
        if (!condition) this.print(console.log, "color:#FFAAAA;", ...args);
    }
    /** 不受开关控制的醒目的 console.log 方法 */
    static tips(...args: any[]) {
        const msg = this.toString(...args);
        if (msg)
            console.log("%c%s", "background-color:#CCCCCC;", msg);
    }

    /** console.group */
    static group(...label: any[]): void {
        if (!this.enable) return;
        const msg = this.toString(...label);
        console.group(msg);
    }
    /** console.groupEnd */
    static groupEnd(): void {
        if (!this.enable) return;
        console.groupEnd();
    }
    /** console.table */
    static table(tabularData: any, properties?: Array<string>): void {
        if (!this.enable) return;
        console.table(tabularData, properties);
    }
    /** console.trace */
    static trace(message?: any, ...optionalParams: any[]): void {
        if (!this.enable) return;
        console.trace(message, ...optionalParams);
    }

    /** 内部方法，用于打印消息 */
    static print(fn: (...args: any[]) => void, colorParam: string, ...args: any[]): void {
        const message = this.toString(...args);
        if (message.length > 0) {
            if (colorParam.length > 0)
                fn("%c%s", colorParam, message);
            else
                fn(message);
        }
    }
    private static toString(...args: any[]): string {
        let message: string = '';
        for (const arg of args) {
            if (typeof arg !== 'string' && typeof arg !== 'number') {
                try {
                    message += ' ' + JSON.stringify(arg, this.replacer.bind(this));
                } catch (error) {
                    message += ` [JSON Converting error: ${error.message}] `;
                    console.debug('Debug message conversion error:', error);
                }
            }
            else
                message += ' ' + arg;
        }
        return message.length > 0 ? (this.prefix + message) : '';
    }
    private static replacer(key: string, value: any): any {
        if (key == 'node') {
            return value ? value.name : 'null';
        }
        else if (key.indexOf('_') == 0) {
            return '略';
        }
        return value;
    }

}
// 注册为全局--便于开关日志控制
globalThis.NRDebug = DebugExt;
